home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
dskut
/
xlat11.zip
/
XFERXLAT.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1990-08-12
|
17KB
|
439 lines
Program xferxlat;
{ Transfer a XLAT translation table between COM and table files. }
{ FreeWare by TapirSoft Gisbert W.Selke, Aug 1990 }
{$UNDEF DEBUG } { DEFINE while debugging }
{$A+,B-,D+,E+,F-,I+,L+,N-,O-,V- }
{$M 16384,0,16384 }
{$IFDEF DEBUG }
{$R+,S+ }
{$ELSE }
{$R-,S- }
{$ENDIF }
Const progname = 'XferXlat';
version = '1.1';
copyright = 'FreeWare by TapirSoft Gisbert W.Selke, Aug 1990';
idstring10= 'XLAT10';
idstring11= 'XLAT11';
idlength = Length(idstring10);
hexnibble : string[16] = '0123456789ABCDEF';
digits : string[10] = '0123456789';
Const fbufsize = 4096;
width = 18;
Type tabletype = Array [byte] Of byte;
fbuftype = Array [1..fbufsize] Of byte;
Var fnamep, fnamet, fnameo : string;
xlat : File;
tabf : text;
fbuf : fbuftype;
fsize : word;
transtype : byte;
doinvert : boolean;
descript, intername : string;
tstart, tabstart, interstart : word;
desclen : byte;
xlatid : byte;
table : tabletype;
exitsave : Pointer;
Function LoCase(ch : char) : char;
{ make characters lower case; national special characters, too! }
Inline($58/$3C/$41/$72/$39/$3C/$5A/$76/$33/$3C/$8E/$75/$02/$B0/$84
/$3C/$99/$75/$02/$B0/$94/$3C/$9A/$75/$02/$B0/$81
/$3C/$80/$75/$02/$B0/$87/$3C/$8F/$75/$02/$B0/$86
/$3C/$90/$75/$02/$B0/$82/$3C/$92/$75/$02/$B0/$91
/$3C/$A5/$75/$02/$B0/$A4/$EB/03/90/$04/$20);
Function hexbyte(b : byte) : string;
{ convert a byte to a string }
Begin { hexbyte }
hexbyte := hexnibble[Succ(b ShR 4)] + hexnibble[Succ(b And $0F)];
End; { hexbtye }
Procedure abort(msg : string; errcode : byte);
{ show message and die }
Begin { abort }
writeln(msg);
Halt(errcode);
End; { abort }
Procedure invert;
{ invert a translation table }
Var temp : tabletype;
i : byte;
Begin { invert }
For i := 0 To 255 Do temp[i] := 0;
For i := 255 DownTo 0 Do temp[table[i]] := i;
table := temp;
End; { invert }
Procedure loadcom(fname : string; loadcomplete : boolean);
{ load a COM file. if not loadcomplete, then load table data only }
Const proginfoptr = 4;
Var i, xfsize, xinterstart, xtstart, xtabstart : word;
xdesclen : byte;
temp : string;
fbuf1 : fbuftype;
Begin { loadcom }
i := FileMode;
FileMode := 0;
Assign(xlat,fname);
{$I- }
Reset(xlat,1);
FileMode := i;
If IOResult <> 0 Then abort('File ' + fname + ' not found',2);
BlockRead(xlat,fbuf1,fbufsize,xfsize);
Close(xlat);
{$I+ }
If IOResult <> 0 Then abort('Error reading file ' + fname,3);
i := fbuf1[proginfoptr] + 1;
temp[0] := Chr(idlength);
Move(fbuf1[i],temp[1],idlength);
xlatid := 0;
If temp = idstring10 Then xlatid := 10;
If temp = idstring11 Then xlatid := 11;
If xlatid = 0 Then abort('Unknown programme version ' + temp + ' in ' +
fname,4);
Move(fbuf1[i+8],xinterstart,2);
If xinterstart >= xfsize Then abort('File ' + fname +
' has invalid format',5);
Inc(xinterstart);
xtstart := Succ(fbuf1[i+6]);
xdesclen := fbuf1[i+7];
Move(fbuf1[i+10],xtabstart,2);
Inc(xtabstart);
Move(fbuf1[xtstart],descript[1],xdesclen);
Move(fbuf1[xtabstart],table,256);
Move(fbuf1[xinterstart],intername[1],8);
intername[0] := #8;
If loadcomplete Then
Begin
fbuf := fbuf1;
fsize := xfsize;
interstart := xinterstart;
tstart := xtstart;
tabstart := xtabstart;
desclen := xdesclen;
descript[0] := Chr(desclen);
End
Else
Begin
For i := Succ(xdesclen) To desclen Do descript[i] := ' ';
End;
End; { loadcom }
Procedure savecom(fname : string);
{ save a translation table as a COM file }
Var iwrite : word;
Begin { savecom }
intername := fname;
While (intername <> '') And (Pos(':',intername) > 0) Do
Delete(intername,1,Pos(':',intername));
While (intername <> '') And (Pos('\',intername) > 0) Do
Delete(intername,1,Pos('\',intername));
While (intername <> '') And (Pos('.',intername) > 0) Do
Delete(intername,Pos('.',intername),255);
While Length(intername) < 8 Do intername := intername + ' ';
{$I- }
Assign(xlat,fname);
Rewrite(xlat,1);
If IOResult <> 0 Then abort('Cannot open ' + fname + ' for output',10);
Move(descript[1],fbuf[tstart],desclen);
Move(table,fbuf[tabstart],256);
Move(intername[1],fbuf[interstart],8);
BlockWrite(xlat,fbuf,fsize,iwrite);
If iwrite <> fsize Then abort('Error writing file ' + fname,11);
Close(xlat);
{$I+ }
End; { savecom }
Procedure loadtable(fname : string);
{ load a translation table from an ASCII table file }
Var i : byte;
tab1 : tabletype;
descript1, lin, cmd, froms, tos, tname : string;
fromval, toval : byte;
ok : boolean;
Function gettok(s : string; Var ptr : byte) : string;
{ returns next token from s, or '' }
Var beg : byte;
Begin { gettok }
While (ptr <= Length(s)) And ((s[ptr] = ' ') Or (s[ptr] = #9)) Do
Inc(ptr);
beg := ptr;
While (ptr <= Length(s)) And (s[ptr] <> ' ') And (s[ptr] <> #9) Do
Begin
s[ptr] := UpCase(s[ptr]);
Inc(ptr);
End;
gettok := Copy(s,beg,ptr-beg);
End; { gettok }
Function decoval(s : string; Var ok : boolean) : byte;
{ decodes a decimal or hexadecimal (prefixed by 'x') value }
Var i1, i2, num : byte;
Begin { decoval }
num := 0;
ok := False;
If s <> '' Then
Begin
If (s[1] = 'X') And (Length(s) >= 1) And (Length(s) <= 3) Then
Begin
If Length(s) = 2 Then
Begin
s[1] := '0';
i2 := 1;
End
Else i2 := 2;
i1 := Pos(s[i2],hexnibble);
i2 := Pos(s[Succ(i2)],hexnibble);
ok := (i1 > 0) And (i2 > 0);
If ok Then num := Pred(i1) ShL 4 + Pred(i2);
End
Else
Begin
For i2 := 1 To Length(s) Do
Begin
i1 := Pos(s[i2],digits);
ok := ok And (i1 > 0);
If ok Then
Begin
If 10*word(num)+ i1 <= 256 Then num := 10*num + Pred(i1);
End;
End;
End;
End;
decoval := num;
End; { decoval }
Begin { loadtable }
i := FileMode;
FileMode := 0;
Assign(tabf,fnam